// 函数泛型约束
// 函数类型上的泛型约束
/**
 * 函数类型上的泛型约束 参数类型和返回值完全相同的情况下，
 * 参数少的函数类型 extends 参数多的函数类型 返回true
 * 参数多的函数类型 extends 参数少的函数类型 返回false
 */
type beginType1 = funcType1 extends funcType2 ? funcType1 : never // never
// 这里成立需要 少的参数和多的参数第一个参数必须相同，返回值也要相同
type beginType2 = funcType2 extends funcType1 ? funcType2 : never // funcType2

// type Extract<T, U> = T extends U ? T : never;
type extractType1 = Extract<funcType1, funcType2> //never
type extractType2 = Extract<funcType2, funcType1> //= (one: number) => string

type funcType1 = (one: number, two: string) => string
type funcType2 = (one: number) => string

// 基础复习：函数参数和回调函数
// 这里的参数可以少写 但是调用的地方不能少写 类型和返回值要匹配
let func: funcType1 = function (one: number, two: string): string {
  console.log(one, two)
  return ''
}
func(1, '1')

function testFun(func: funcType1) {
  func(1, '1')
}
testFun(func) // 回调函数
export {}
